package com.hxzy.projectssmplus.exception;


import com.hxzy.projectssmplus.vo.AjaxResult;
import io.jsonwebtoken.ExpiredJwtException;
import io.jsonwebtoken.MalformedJwtException;
import io.jsonwebtoken.SignatureException;
import lombok.extern.log4j.Log4j;
import lombok.extern.log4j.Log4j2;
import org.springframework.validation.BindException;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

import javax.validation.ValidationException;
import javax.xml.ws.Service;
import java.sql.SQLIntegrityConstraintViolationException;

/**
 * springmvc全局异常处理
 */
@Log4j2
@RestControllerAdvice
public class MvcGlobalException {

    /**
     * BindException  子类 MethodArgumentNotValidException  验证异常处理
     * @param e
     */
    @ExceptionHandler(BindException.class)
    public AjaxResult validator_BindException(BindException e){
        String msg=e.getFieldError().getDefaultMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        return AjaxResult.error(msg);
    }


    /**
     * 验证异常处理 
     * @param e
     * @return
     */
    @ExceptionHandler(ValidationException.class)
    public AjaxResult validator_ValidationException(ValidationException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        return AjaxResult.error("数据格式不正确");
    }

    /**
     * 数据库值违返唯一约束
     * @param e
     * @return
     */
    @ExceptionHandler(SQLIntegrityConstraintViolationException.class)
    public AjaxResult sQLIntegrityConstraintViolationException(SQLIntegrityConstraintViolationException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        return AjaxResult.error("数据库值重复了");
    }

    /**
     * 业务逻辑异常
     * @param e
     * @return
     */
    @ExceptionHandler(ServiceException.class)
    public AjaxResult serviceException(ServiceException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端s
        return AjaxResult.error("数据库值重复了");
    }

    /**
     * jwt令牌过期
     * @param e
     * @return
     */
    @ExceptionHandler(ExpiredJwtException.class)
    public AjaxResult expiredJwtException(ExpiredJwtException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        AjaxResult ajaxResult= AjaxResult.error("登录过期了，请重新登录！");
        ajaxResult.put("code",50000);
        return ajaxResult;
    }



    /**
     * jwt的密钥错误
     * @param e
     * @return
     */
    @ExceptionHandler(SignatureException.class)
    public AjaxResult signatureException(SignatureException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        AjaxResult ajaxResult= AjaxResult.error("令牌无效！");
        ajaxResult.put("code",50001);
        return ajaxResult;
    }



    /**
     * jwt的串被人改过
     * @param e
     * @return
     */
    @ExceptionHandler(MalformedJwtException.class)
    public AjaxResult malformedJwtException(MalformedJwtException e){
        String msg=e.getMessage();
        //本地日志
        log.error(e.getMessage());
        //只显示第一个错误给前端
        AjaxResult ajaxResult= AjaxResult.error("令牌异常，请重新登录！");
        ajaxResult.put("code",50002);
        return ajaxResult;
    }

}
